<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 继承 
        // 1.原型继承
        // function Person(name,age){
        //     this.name = name;
        //     this.age = age;
        // }

        // Person.prototype.sayHello = function(){
        //     console.log('我是原型继承');
        // }

        // Student.prototype = new Person('panpan',18);
        // function Student(gender,name){
        //     this.gender = gender
        //     this.name = name;
        // }

        // var s = new Student('男','李四');
        // console.log(s);
        // console.log(s.age); // 18 
        // console.log(s.sayHello()); // 李四
        // // 可以继承父类的属性和方法
        // // 但是 自己没有了原型 而且 继承的属性也在原型上 不在自己身上 

        // 2.构造函数继承
        function Person(name,age){
            this.name = name;
            this.age = age;
        }

        Person.prototype.sayHello = function(){
            console.log('我是原型继承');
        }


        function Student(gender,...args){
            this.gender = gender;
            this
            // 把父类函数当做普通函数执行
            // 把Person的this指向Student的实例对象
            Person.call(this,...args);
        }

        const s1 = new Student('男','李四',18);

        // 李四  18 给到 ...args 
        // ...args 赋值给Person 
        console.log(s1);

        console.log(s1.age); // 18
        console.log(s1.sayHello()); // 报错


        // 优点 把 父类的属性集成到自己的实例对象上
        // 缺点 不能继承父类的原型上的方法
    </script>
</body>
</html>